#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        //子进程
        int cnt = 10;
        while(cnt)
        {
            printf("我是子进程：%d,父进程：%d, cnt:%d\n", getpid(),getppid(),cnt--);
            //int *p;
            //*p = 100;//野指针问题
            sleep(3);
        }
        //运行完
        //1.代码完，结果对
        //2.代码完，结果不对
        //代码没跑完，出异常了
        exit(10);//进程退出。
    }
    //父进程
    int status = 0;//不是被整体使用的，有自己的位图结构。
    //pid_t ret = wait(NULL);
    //pid_t ret = waitpid(id, &status, 0);//阻塞式等待
    while(1)
    {
        pid_t ret = waitpid(id, &status, WNOHANG);//非阻塞式等待-》子进程没有推出子进程没有退出，父进程检测的时候，立即返回。
        if(ret == 0)
        {
            //waitpid 调用成功 && 子进程没有退出
            //子进程没有退出，我的waitpid没有等待失败，仅仅是监测到了子进程没有退出
            printf("wait done, but child is running...\n");
        }
        else if(ret > 0)
        {
            //waitpid调用成功 && 子进程退出了
            printf("wait success:%d, sig number/*进程信号*/:%d, child exit code/*子进程退出码*/:%d\n",ret,(status & 0x7f), (status >> 8) & 0xff);
            break;
        }
        else
        {
            //waitpid调用失败
            printf("waitpid call failed\n");
            break;
        }
        sleep(1);
    }






    //if(ret > 0)
    //{
    //    //是否正常退出
    //    if(WIFEXITED(status))
    //    {
    //        //判断子进程运行结果是否ok
    //        printf("exit code:%d\n", WEXITSTATUS(status));
    //    }
    //}
    //if(id > 0)
    //{
    //    printf("wait success:%d, sig number/*进程信号*/:%d, child exit code/*子进程退出码*/:%d\n",ret,(status & 0x7f), (status >> 8) & 0xff);
    //    printf("wait success:%d\n", ret);
    //}
    return 0;
}
